package com.munhrasoft.dinamica.managedbeans;

import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.application.FacesMessage.Severity;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;

import org.primefaces.event.SelectEvent;
import org.primefaces.event.TabChangeEvent;

import com.munhrasoft.dinamica.business.entities.Vendedor;
import com.munhrasoft.dinamica.business.logic.VendedorEJB;

@ManagedBean
@ViewScoped
public class VendedorController {

    /*
     * Acho que nao vai precisar de ficar inicializando direto os objetos como no exemplo do
     * tabchanged, acho que quem anulava o objeto de pesquisa era o datatable
     */

    private static Logger  logger       = Logger.getLogger(VendedorController.class.getName());

    @EJB
    private VendedorEJB    vendedorEJB;

    private Vendedor       vendedor     = new Vendedor();
    private Vendedor       pesqvendedor = new Vendedor();
    private Vendedor       resvendedor  = new Vendedor();
    private List<Vendedor> vendedorList = new ArrayList<Vendedor>();

    @PostConstruct
    public void init() {
        logger.info("PostConstruct");
        vendedorList = vendedorEJB.fetchAllVendedores();
        pesqvendedor = new Vendedor();
        vendedor = new Vendedor();
        resvendedor = new Vendedor();
    }

    public void createVendedor(ActionEvent actionEvent) {
        vendedor = vendedorEJB.createVendedor(vendedor);
        vendedor = new Vendedor();
        pesqvendedor = new Vendedor();
        showMessage(FacesMessage.SEVERITY_INFO, "Operaçãoo concluída", "Vendedor criado com sucesso");
    }

    public void pegarTodosVendedores(ActionEvent actionEvent) {
        vendedorList = vendedorEJB.fetchAllVendedores();

        if (!vendedorList.isEmpty()) {
            pesqvendedor = vendedorList.get(0);
        } else {
            showMessage(FacesMessage.SEVERITY_INFO, "Operaçãoo concluída",
                    "Nenhum vendedor encontrado");
        }

    }

    public void saveVendedor(ActionEvent actionEvent) {
        pesqvendedor = vendedorEJB.updateVendedor(pesqvendedor);
        if (pesqvendedor != null) {
            showMessage(FacesMessage.SEVERITY_INFO, "Operaçãoo concluída",
                    "Vendedor atualizado com sucesso");
        } else {
            showMessage(FacesMessage.SEVERITY_ERROR, "Erro", "O Vendedor não foi atualizado");
        }
    }

    public void removeVendedor(ActionEvent actionEvent) {
        // TODO acho que nao vai dar para apenas remover o vendedor, se ele estiver amarrado
        // a algum processo.

        if (pesqvendedor != null) {
            vendedorEJB.removeVendedor(pesqvendedor);
            vendedorList = vendedorEJB.fetchAllVendedores();
            pesqvendedor = new Vendedor();
            showMessage(FacesMessage.SEVERITY_INFO, "Operação concluída",
                    "Vendedor removido com sucesso");
        } else {
            showMessage(FacesMessage.SEVERITY_ERROR, "Operação falhou", "Cliente não selecionado");
        }

    }

    public void rowSelect(SelectEvent event) {
        logger.info("Row select");
        pesqvendedor = resvendedor;

    }

    public void changeTabView(TabChangeEvent event) {
        logger.info("Tabview changed " + event.getTab().getId());
        vendedorList = vendedorEJB.fetchAllVendedores();
        pesqvendedor = new Vendedor();
        vendedor = new Vendedor();
    }

    private void showMessage(Severity sev, String summary, String detail) {
        FacesMessage message = new FacesMessage(sev, summary, detail);
        FacesContext.getCurrentInstance().addMessage(null, message);
    }

    public Vendedor getVendedor() {
        return vendedor;
    }

    public void setVendedor(Vendedor vendedor) {
        this.vendedor = vendedor;
    }

    public Vendedor getPesqvendedor() {
        return pesqvendedor;
    }

    public void setPesqvendedor(Vendedor pesqvendedor) {
        this.pesqvendedor = pesqvendedor;
    }

    public Vendedor getResvendedor() {
        return resvendedor;
    }

    public void setResvendedor(Vendedor resvendedor) {
        this.resvendedor = resvendedor;
    }

    public List<Vendedor> getVendedorList() {
        return vendedorList;
    }

    public void setVendedorList(List<Vendedor> vendedorList) {
        this.vendedorList = vendedorList;
    }

}
